#ifndef __BSF_H__
#define __BSF_H__

#define BSF_VERSION 0x03
#define TRANSMITTER 1
#define RECEIVER    0
#define MAX_CONTINUE_COUNTER 3
#define DISCONNECT_TIME_THRESHOLD 50
#define CONNECT_TIME_THRESHOLD 400
#define IDEL_TIME_THRESHOLD 20
#define MATCH_TIME_THRESHOLD 100
#define MATCH_TIMEOUT 1
#define MATCH_BOOT_TIMEOUT 5
void bsf_init(void);
void bsf_reset(void);//重置，此时bsf会清理存储内容,配对状态也会取消,设备的配对状态重新进行
unsigned char bsf_isMatch(void);//配对状态指示
unsigned char bsf_do(void);
unsigned char bsf_isSendBufFree(void);
unsigned char bsf_isRecvBufNE(void);
unsigned char *bsf_recvBegin(unsigned char *outLen);
void bsf_recvEnd(unsigned char isRecvOk);
unsigned char *bsf_sendBegin();
void bsf_sendEnd(unsigned char len);

//payload结构体必须使用字节进行通讯，避免大小端问题
typedef struct 
{
    unsigned char len;//包长度，不含len 即最长63
    unsigned char ID[2];//设备ID,包含高字节和低字节
    unsigned char tag;//标志位 1
    unsigned char buf[60];//有效载荷 60
}BSF_Payload;
//storage 也必须使用char类型，避免问题
typedef struct 
{
    unsigned char version;
    unsigned char ID[2];
    unsigned char match;//0xAA代表已经配对， 其他代表未配对
    unsigned char reserved[4];
}BSF_Storage;

typedef struct 
{
    unsigned short int RecvSendTimestamp;//以毫秒
    unsigned short int LossTimestamp;//以毫秒计数的时间戳
    unsigned char BurnOutTimestampSec;//以秒计数的时间戳
    unsigned char SyncTimestampSec;//同步计时，以秒
    unsigned char SyncOnBootJobSec;//在上电时，会等待5秒左右匹配从机，如果没有，则会回到已匹配状态
}BSF_Timer;

typedef struct 
{
    unsigned char index;
    unsigned char *table;
}BSF_ChannelManager;

#define BSF_IS_ID_ZERO(x) (((x).ID[0] == 0x00) && ((x).ID[1] == 0x00))
#define BSF_IS_ID_MATCH(a,b) (((a).ID[0] == (b).ID[0]) && ((a).ID[1] == (b).ID[1]))
#define BSF_SET_ID_INT(x,val) do{unsigned short int d = val;(x).ID[0] = (unsigned char )((d)>>8); (x).ID[1] = (unsigned char )(d);}while(0)
#define BSF_SET_ID_CPY(dest,src) do{(dest).ID[0] = (src).ID[0];(dest).ID[1] = (src).ID[1];}while(0)

#define BSF_TYPE(x)  ((unsigned char)((x).tag & 0xC0))
#define BSF_TYPE_SET(x,btype) do{(x).tag &= 0x3F;(x).tag |= btype;}while(0)
#define BSF_TYPE_EMPTY_PACK     0x00//空包，用于占用信道,从机可以返回空包或者数据包
#define BSF_TYPE_PAYLOAD_RET    0x40//数据包，从机可以选择返回空或数据
#define BSF_TYPE_PAYLOAD_NORET  0x80//数据包，从机不能返回（从机返回只能用这种类型）
#define BSF_TYPE_SYNC_PACK      0xC0//同步包，只有在同步时使用这种包类型，其余时刻不可以使用该类型
#define BSF_BURNOUT_MAX  0x3F
#define BSF_BURNOUT_REFILL(x) (((x).tag) |= BSF_BURNOUT_MAX) 
#define BSF_BURNOUT(x) (((x).tag) & BSF_BURNOUT_MAX) 
#define BSF_BURNOUTSET(x,value) do{(x).tag &= 0xC0; (x).tag |= (value& 0x3F);}while(0)
#define BSF_RESET_TIMER(timer,target) ((timer).target) = 0
#define BSF_SET_TIMER(timer,target,val) ((timer).target) = (val)
#define BSF_TRUE 1
#define BSF_FALSE 0
#define BSF_MATCH 0xAA

#define BSF_PAIR   0xF1
#define BSF_CONNECT 0xF2
#define BSF_DISCONNECT 0xF3
#endif